package packgui;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.*;

import packmodele.*;

/**
 * Classe gérant la fenêtre du programme, et permettant de switcher entre les
 * différentes vues
 * 
 * @author Paulino
 * 
 */
public class FramePrincipale extends JFrame implements ConnexionListener
{
	private static final long serialVersionUID = 1L;

	public static FramePrincipale instance;
	public static String PANEL_PRODUITS = "Produits", PANEL_PANIER = "Panier",
			PANEL_ADMIN = "Admin";

	private JMenuBar barreMenu;
	private JMenu jmVue, jmNonConnecte, jmConnecte;
	private JMenuItem jmiProduits, jmiPanier, jmiAdmin, jmiConnexion,
			jmiInscription, jmiDeconnexion, jmiParams;
	private CardLayout cardLayout;
	private PanelVueProduits pProduits;
	private PanelVuePanier pPanier;
	private PanelVueAdmin pAdmin;
	private String code = "helha";

	/**
	 * Permet la récupération de l'instance de la fenêtre principale
	 * 
	 * @return La fenêtre principale
	 */
	public static FramePrincipale getInstance()
	{
		if (instance == null) instance = new FramePrincipale();
		return instance;
	}

	private FramePrincipale()
	{
		super("Projet java");
		Systeme.getInstance().addConnexionListener(this);
		init();
	}

	public void init()
	{
		setSize(800, 500);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setLocationRelativeTo(null);

		setJMenuBar(getBarreMenu());
		setLayout(getCardLayout());
		add(getPProduits(), PANEL_PRODUITS);
		add(getPPanier(), PANEL_PANIER);
		add(getPAdmin(), PANEL_ADMIN);

		addWindowListener(new WindowListener()
		{
			@Override
			public void windowOpened(WindowEvent event)
			{}

			@Override
			public void windowIconified(WindowEvent event)
			{}

			@Override
			public void windowDeiconified(WindowEvent event)
			{}

			@Override
			public void windowDeactivated(WindowEvent event)
			{}

			@Override
			public void windowClosing(WindowEvent event)
			{
				Serialiseur.sauvegardersProduits("Stock.dat", Systeme
						.getInstance().getStock());
				Serialiseur.sauvegardersParametresEmail("Params.dat", Systeme
						.getInstance().getParametresEmail());
				Serialiseur.sauvegarderUtilisateurs("Utilisateurs.dat", Systeme
						.getInstance().getUtilisateurs());
			}

			@Override
			public void windowClosed(WindowEvent event)
			{}

			@Override
			public void windowActivated(WindowEvent event)
			{}
		});
	}

	public JMenuBar getBarreMenu()
	{
		if (barreMenu == null)
		{
			barreMenu = new JMenuBar();
			barreMenu.add(getJmVue());
			barreMenu.add(getJmNonConnecte());
			barreMenu.add(getJmConnecte());

			getJmConnecte().setVisible(false);
		}
		return barreMenu;
	}

	public JMenu getJmVue()
	{
		if (jmVue == null)
		{
			jmVue = new JMenu("Vue");
			jmVue.add(getJmiProduits());
			jmVue.add(getJmiPanier());
			jmVue.add(getJmiAdmin());
		}
		return jmVue;
	}

	public JMenuItem getJmiProduits()
	{
		if (jmiProduits == null)
		{
			jmiProduits = new JMenuItem("Produits");
			jmiProduits.addActionListener(new ActionListener()
			{

				@Override
				public void actionPerformed(ActionEvent arg0)
				{
					setVue(PANEL_PRODUITS);
				}
			});
		}
		return jmiProduits;
	}

	public JMenuItem getJmiPanier()
	{
		if (jmiPanier == null)
		{
			jmiPanier = new JMenuItem("Panier");
			jmiPanier.addActionListener(new ActionListener()
			{

				@Override
				public void actionPerformed(ActionEvent arg0)
				{
					setVue(PANEL_PANIER);
				}
			});
		}
		return jmiPanier;
	}

	public JMenuItem getJmiAdmin()
	{
		if (jmiAdmin == null)
		{
			jmiAdmin = new JMenuItem("Admin");
			jmiAdmin.addActionListener(new ActionListener()
			{
				// Verification du mot de passe de l'admin
				@Override
				public void actionPerformed(ActionEvent arg0)
				{
					String rep = JOptionPane.showInputDialog(
							FramePrincipale.this, "Entrer le code : ",
							"Connexion", JOptionPane.INFORMATION_MESSAGE);
					if (rep.equals(code) == false)
					{
						JOptionPane.showMessageDialog(FramePrincipale.this,
								"Mauvais mot de passe !", "Erreur",
								JOptionPane.ERROR_MESSAGE);
					}
					else
					{
						setVue(PANEL_ADMIN);
					}
				}
			});
		}
		return jmiAdmin;
	}

	public CardLayout getCardLayout()
	{
		if (cardLayout == null)
		{
			cardLayout = new CardLayout();
		}
		return cardLayout;
	}

	public PanelVueProduits getPProduits()
	{
		if (pProduits == null)
		{
			pProduits = new PanelVueProduits();
		}
		return pProduits;
	}

	public PanelVuePanier getPPanier()
	{
		if (pPanier == null)
		{
			pPanier = new PanelVuePanier();
		}
		return pPanier;
	}

	public PanelVueAdmin getPAdmin()
	{
		if (pAdmin == null)
		{
			pAdmin = new PanelVueAdmin();

		}
		return pAdmin;
	}

	/**
	 * Raccourcis pour le changement de vue du cardLayout (plus simple à
	 * utiliser depuis l'extérieur de la classe)
	 * 
	 * @param nomVue
	 */
	public void setVue(String nomVue)
	{
		getCardLayout().show(this.getContentPane(), nomVue);
	}

	public JMenu getJmNonConnecte()
	{
		if (jmNonConnecte == null)
		{
			jmNonConnecte = new JMenu("Connexion");
			jmNonConnecte.add(getJmiConnexion());
			jmNonConnecte.add(getJmiInscription());
		}
		return jmNonConnecte;
	}

	public JMenu getJmConnecte()
	{
		if (jmConnecte == null)
		{
			jmConnecte = new JMenu("Profil");
			jmConnecte.add(getJmiDeconnexion());
			jmConnecte.add(getJmiParams());
		}
		return jmConnecte;
	}

	public JMenuItem getJmiConnexion()
	{
		if (jmiConnexion == null)
		{
			jmiConnexion = new JMenuItem("Se connecter");
			jmiConnexion.addActionListener(new ActionListener()
			{

				@Override
				public void actionPerformed(ActionEvent event)
				{
					FrameConnexion frame = new FrameConnexion();
					frame.setVisible(true);
				}
			});
		}
		return jmiConnexion;
	}

	public JMenuItem getJmiInscription()
	{
		if (jmiInscription == null)
		{
			jmiInscription = new JMenuItem("S'inscrire");
			jmiInscription.addActionListener(new ActionListener()
			{

				@Override
				public void actionPerformed(ActionEvent event)
				{
					FrameUtilisateur frame = new FrameUtilisateur();
					frame.setVisible(true);
				}
			});
		}
		return jmiInscription;
	}

	public JMenuItem getJmiDeconnexion()
	{
		if (jmiDeconnexion == null)
		{
			jmiDeconnexion = new JMenuItem("Se déconnecter");
			jmiDeconnexion.addActionListener(new ActionListener()
			{

				@Override
				public void actionPerformed(ActionEvent event)
				{
					Systeme.getInstance().deconnexion();
					getJmNonConnecte().setVisible(true);
					getJmConnecte().setVisible(false);
				}
			});
		}
		return jmiDeconnexion;
	}

	public JMenuItem getJmiParams()
	{
		if (jmiParams == null)
		{
			jmiParams = new JMenuItem("Paramètres");
			jmiParams.addActionListener(new ActionListener()
			{

				@Override
				public void actionPerformed(ActionEvent event)
				{
					FrameUtilisateur frame = new FrameUtilisateur(Systeme
							.getInstance().getUtilisateur());
					frame.setVisible(true);
				}
			});
		}
		return jmiParams;
	}

	@Override
	public void connexion(Utilisateur utilisateur)
	{
		getJmConnecte().setVisible(true);
		getJmNonConnecte().setVisible(false);
	}

	@Override
	public void deconnexion(Utilisateur utilisateur)
	{
		getJmConnecte().setVisible(false);
		getJmNonConnecte().setVisible(true);
	}
}
